<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /*
      面向对象的特色：封装，继承，多态。

      1.封装
        - 对象就是一个用来存储不同属性的容器
        - 除了存储数据之外，对象还要负责数据的安全
        - 直接添加到对象中的属性并不安全，可以被任意的修改
        - 如何确保数据安全？
          1.私有化数据
          2.提供getter和setter方法来开放对数据的操作
    */

    class Person {
      #address = '花果山' // 实例属性通过#开头，就变成了私有属性,只能在类的内部访问
      #name // 私有属性必须先声明
      #age
      constructor(name,age,gender) {
        this.#name= name
        this.#age = age
        this.gender = gender
      }
      sayHello() {
        console.log('hello',this.name)
      }
      getAddress() {
        console.log(this.#address)
      }
      getName() {
        return this.#name
      }
      setName(name) {
        this.#name = name
      }
      // 简化写法
      get age() {
        return this.#age
      }
      set age(value) {
        this.#age = value
      }
    }
    const p1 = new Person('孙悟空',18,'男')
    console.log(p1)
    p1.getAddress() // 花果山
    p1.getName() // 孙悟空
    p1.setName('猪八戒')
    p1.getName() // 猪八戒
    p1.age = 20
  </script>
</body>
</html>